home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Software Contest 3
/
FM Towns Software Contest 3.iso
/
exp
/
telop
/
denko
/
source
/
pro20.asm
< prev
next >
Wrap
Assembly Source File
|
1994-01-07
|
9KB
|
494 lines
assume cs:code,ds:data,es:data,fs:data,gs:data,ss:sseg
code segment
entry: push 110h
pop fs
call crtc_set
call vram_clear
call msgfile_read
jc exit
title_back:
call opening_put
call board_put
cli
push 120h
pop es
mov edi,140*512*2
mov ecx,8
init: add edi,32*2
call space_put
loop init
mov eax,0101001111000000b
lea esi,stringswork
main: movzx ebx,byte ptr ds:[statuswork]
lea ebx,[sub_label+ebx*4]
call cs:[ebx]
jmp main
sub_label:
dd normal,return_wait,pause,flash
exit: sti
mov ax,4c00h
int 21h
;*******************************************************
; normal proc
; コントロールコードのチェックと文字を書くルーチン
;*******************************************************
normal proc
mov edi,dword ptr ds:[scrollwork]
test edi,000000fh ;16回に1回
jnz #scroll
call code_analyze
jc #control_code_check
and edi,255
lea edi,[edi*4] ;ebx=ebx*2*2
add edi,32*2*9
and edi,1023
add edi,512*2*140
mov bx,word ptr ds:[esi]
xchg bh,bl
call char_put
add esi,2
#scroll:call scroll
call vsync_wait
ret
#control_code_check:
mov bx,ds:[esi]
cmp bl,'1'
jz #color_change
cmp bl,'2'
jz #pause
cmp bl,'3'
jz #flash
cmp bx,0a0dh ;CR,LF code
jz #return_wait
cmp bl,1ah ;EOFmark
jz exit
cmp bl,00h
jz exit
cmp bx,'40'
jz #title_back
cmp bx,'00' ;END control code
jz exit
cmp bx,'50'
jnz #error
lea esi,[stringswork-1]
#error: inc esi ;not control code,illegal control code
ret
#color_change:
cmp bh,'0'
js #error
cmp bh,'5'
jns #error
sub bh,'0'
movzx ebx,bh
movzx eax,word ptr ds:[#color_code+ebx*2]
add esi,2
ret
#color_code:
dw 0101001111000000b ;orange
dw 0111101000000000b ;green
dw 0000001111000100b ;red
dw 0000000000011111b ;blue
dw 0111111111100000b ;yellow
#return_wait:
mov byte ptr ds:[statuswork],1
mov byte ptr ds:[timerwork],0
mov edx,dword ptr ds:[scrollwork]
and edx,255
lea edx,[edx*4] ;ebx=ebx*2*2
add edx,32*2*9
mov ecx,8
#r000: mov edi,edx
and edi,1023
add edi,512*2*140
call space_put
add edx,32*2
dec ecx
jnz #r000
add esi,2
ret
#pause: sub bh,'0'-1
movzx ebx,bh
shl ebx,4
mov ds:[timerwork],bl
mov byte ptr ds:[statuswork],2
add esi,2
ret
#flash: sub bh,'0'-1
movzx ebx,bh
lea ebx,[ebx*2]
mov ds:[counterwork],bl
mov byte ptr ds:[statuswork],3
mov byte ptr ds:[timerwork],0
mov edx,dword ptr ds:[scrollwork]
and edx,255
lea edx,[edx*4] ;ebx=ebx*2*2
add edx,32*2*9
mov ecx,8
#f000: mov edi,edx
and edi,1023
add edi,512*2*140
call space_put
add edx,32*2
dec ecx
jnz #f000
add esi,2
ret
#title_back:
sub esp,4
jmp title_back
normal endp
;******************************************************
; return_wait proc
; リターンコードの処理を行う
;******************************************************
return_wait proc
call vsync_wait
inc byte ptr ds:[timerwork]
cmp byte ptr ds:[timerwork],128
jnz #000
mov byte ptr ds:[statuswork],0
mov byte ptr ds:[timerwork],0
#000: call scroll
ret
return_wait endp
;******************************************************
; pause proc
; 一時停止の処理を行う
;******************************************************
pause proc
call vsync_wait
dec byte ptr ds:[timerwork]
jnz #000
mov byte ptr ds:[statuswork],0
#000: ret
pause endp
;******************************************************
; flash proc
; 点滅の処理を行う
;******************************************************
flash proc
pushad
call vsync_wait
mov bl,ds:[timerwork]
test bl,0001111b
jnz #002c
mov dx,0440h
mov al,17
out dx,al
add dx,2
mov eax,dword ptr ds:[scrollwork]
and bl,0010000b
jnz #001b
#001a: add eax,16+16*8
and eax,255
out dx,ax
jmp #002a
#001b: add eax,16
and eax,255
out dx,ax
#002a: inc byte ptr ds:[timerwork]
dec byte ptr ds:[counterwork]
jnz #002b
mov byte ptr ds:[statuswork],0
mov byte ptr ds:[timerwork],0
#002b: popad
ret
#002c: inc byte ptr ds:[timerwork]
popad
ret
flash endp
;******************************************************
; msgfile_read proc
; コマンドラインのメッセージファイルを読み込む
; out-----carryflag(0-no error,1-error)
;******************************************************
msgfile_read proc
pushad
push ds
push 0024h ;PSP selecter
pop ds
mov edx,0080h
movzx eax,byte ptr ds:[edx] ;eax=length
inc edx
mov byte ptr ds:[edx+eax],00h
mov ax,3d00h ;file open
int 21h
jc #error
mov bx,ax
mov ecx,4*1024
pop ds
lea edx,stringswork
mov ah,3fh ;file read
int 21h
mov ah,3eh ;file close
int 21h
popad
ret
#error: pop ds
popad
ret
msgfile_read endp
;******************************************************
; vsync_wait proc
; 1/60秒のウェイトをいれる
; No register
;******************************************************
vsync_wait proc
push eax
push edx
mov dx,0fda0h
#001: in al,dx
test al,00000001b
jnz #001
#002: in al,dx
test al,00000001b
jz #002
pop edx
pop eax
ret
vsync_wait endp
;******************************************************
; code_analyze proc
; コードを解析する (Oh!FM 1991-7 p91参照)
; in----ds:esi=code address
; out---carryflag(0-code=sjis,1-code=ank)
;******************************************************
code_analyze proc
pushad
lodsb
cmp al,080h
jz #ank
and al,0f0h
cmp al,0e0h
jz #sjis
cmp al,090h
jz #sjis
cmp al,080h
jz #sjis
#ank: stc
popad
ret
#sjis: clc
popad
ret
code_analyze endp
;******************************************************
; scroll proc
; ページ0を2ドット左にスクロールさせる
; No register
;******************************************************
scroll proc
pushad
inc dword ptr ds:[scrollwork]
mov dx,0440h
mov al,17
out dx,al
add dx,2
mov eax,dword ptr ds:[scrollwork]
add eax,16
and eax,255
out dx,ax
popad
ret
scroll endp
;******************************************************
; crtc_set proc
; 画面モードセット
; No register
;******************************************************
crtc_set proc
mov ah,00h
lea edi,tbioswork
mov ecx,800h
call pword ptr fs:[20h]
mov ax,0100h
mov dx,10
call pword ptr fs:[20h]
mov ax,0101h
mov dx,10
call pword ptr fs:[20h]
mov ax,0500h ;page0(font) write
call pword ptr fs:[20h]
mov ax,0202h
mov bx,2
mov dx,2
call pword ptr fs:[20h]
mov ax,0203h
mov bx,240
mov dx,32*8
call pword ptr fs:[20h]
mov ax,0200h
mov bx,0
mov dx,32
call pword ptr fs:[20h]
mov ax,0201h
mov bx,0
mov dx,32
call pword ptr fs:[20h]
mov ax,0501h ;page1(back graphic) write
call pword ptr fs:[20h]
mov ax,0202h
mov dx,2
mov bx,2
call pword ptr fs:[20h]
mov ax,0203h
mov dx,320
mov bx,240
call pword ptr fs:[20h]
mov ax,0600h ;priority 0>1
mov edx,3
call pword ptr fs:[20h]
ret
crtc_set endp
;******************************************************
; vram_clear proc
; ページ0,1を透明に塗りつぶす
; No register
;******************************************************
vram_clear proc
pushad
push es
push 120h
pop es
mov eax,80008000h
mov ecx,512*1024/4
sub edi,edi
rep stosd
pop es
popad
ret
vram_clear endp
;******************************************************
; char_put proc
; SJISコードを表示する
; edi=vram address
; eax=character color(0000xxxxh)
; bx=sjis code
; es=vram selector
; fs=tbios selectr
;******************************************************
char_put proc
pushad
push ds
push eax
movzx ebx,bx
shl bh,1
cmp bl,080h
adc bx,1f61h
add bl,7fh
jc short #001a
add bl,0a2h
#001a: and bh,7fh
mov ax,0100h
mov dx,1010h
call pword ptr fs:[0a0h]
cmp ah,00h ;code is not S-jis Code
jnz exit
pop ebx
sub edx,edx
sub ecx,ecx
#002a: lodsw ;mov ax,ds:[esi]
xchg ah,al
#002b: shl ax,1
jnc #002d
mov dword ptr es:[edi],ebx
#002c: add edi,4
inc edx
cmp edx,16
jnz #002b
sub edx,edx
add edi,(1024-32)*2
inc ecx
cmp ecx,16
jnz #002a
pop ds
popad
ret
#002d: mov dword ptr es:[edi],0100001000010000b
jmp #002c
char_put endp
;******************************************************
; space_put proc
; スペースを表示する
; edi=vram address
; es=vram selector
; fs=tbios selectr
;******************************************************
space_put proc
pushad
sub edx,edx
sub ecx,ecx
mov eax,0100001000010000b
#000: mov dword ptr es:[edi],eax
add edi,4
inc edx
cmp edx,16
jnz #000
sub edx,edx
add edi,(1024-32)*2
inc ecx
cmp ecx,16
jnz #000
popad
ret
space_put endp
include tif_read.asm
code ends
data segment
scrollwork dd 00h
tbioswork db 800h dup(?)
stringswork db 4*1024 dup(?),00h
statuswork db 00h
timerwork db 00h
counterwork db 00h
buffer db 154112-512 dup(?)
data ends
sseg segment stack
db 4096 dup(?)
sseg ends
end entry